package com.example.testi18n.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

public class RedpacketUtil {

    public static void main(String[] args) {
        List<BigDecimal> moneys = math(BigDecimal.valueOf(22.64664684), 3);
        if (moneys != null) {
            BigDecimal b = new BigDecimal(0);
            for (BigDecimal bigDecimal : moneys) {
                System.out.println(bigDecimal + "元    ");
                b = b.add(bigDecimal);
            }


            System.out.println("   总额：" + b +"元 ");
            System.out.println();
        }
    }

    /**
     * 整改：金额分配
     * 计算每人获得红包金额;最小每人0.0000001元
     * @param totalMoney 红包总额
     * @param number 人数
     */
    public static List<BigDecimal> math(BigDecimal totalMoney, int number) {
        if (totalMoney.compareTo(BigDecimal.valueOf(number * 0.00000001)) < 0) {
            return null;
        }
        Random random = new Random();
        // 金钱，按分计算 10块等于 1000分
        BigDecimal money = totalMoney.multiply(BigDecimal.valueOf(10000000));
        // 随机数总额
        BigDecimal count = BigDecimal.ZERO;
        // 每人获得随机点数
        BigDecimal[] arrRandom = new BigDecimal[number];
        // 每人获得钱数
        List<BigDecimal> arrMoney = new ArrayList<BigDecimal>(number);
        // 循环人数 随机点
        for (int i = 0; i < arrRandom.length; i++) {
            BigDecimal r =  BigDecimal.valueOf(random.nextDouble());
            count = count.add(r);
//            count += r;
            arrRandom[i] = r;
        }
        // 计算每人拆红包获得金额
        BigDecimal c = BigDecimal.ZERO;
        for (int i = 0; i < arrRandom.length; i++) {
            // 每人获得随机数相加 计算每人占百分比
            BigDecimal x = arrRandom[i].divide(count, 8, RoundingMode.DOWN);
            // 每人通过百分比获得金额
            long m = (long) Math.floor(Double.parseDouble(x.multiply(money).toPlainString()));
            // 如果获得 0 金额，则设置最小值 1分钱
            if (m == 0) {
                m = 1;
            }
            // 计算获得总额
            c = c.add(new BigDecimal(m));
//            c += m;
            // 如果不是最后一个人则正常计算
            if (i < arrRandom.length - 1) {
                arrMoney.add(new BigDecimal(m).divide(new BigDecimal(10000000), 8, RoundingMode.DOWN));
            } else {
                // 如果是最后一个人，则把剩余的钱数给最后一个人
                BigDecimal lastMoney = money.subtract(c).add(BigDecimal.valueOf(m));
                arrMoney.add(lastMoney.divide(new BigDecimal(10000000), 8, RoundingMode.DOWN));
            }
        }
        // 随机打乱每人获得金额
        Collections.shuffle(arrMoney);
        return arrMoney;
    }
}
